# from modbus_tk import modbus_rtu
# import serial
#
# # 创建一个Modbus RTU主站
# # master = modbus_rtu.RtuMaster('/dev/ttyUSB0')
# master = modbus_rtu.RtuMaster(
#             serial.Serial(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, xonxoff=0)
#         )
#
# # 设置串口参数
# master.set_timeout(5.0)
# master.set_verbose(True)
#
# # 连接到设备
# master.open()
#
#
# # 读取保持寄存器的值
# result = master.execute(1, modbus_rtu.READ_HOLDING_REGISTERS, 0, 10)
#
#
# # 打印结果
# print(result)
#
# # 关闭连接
# master.close()


# 点位结果 地址 1 2 3  # value ok/ng  1,2
# 心跳 地址 0
# 类型int16

import modbus_tk.defines as cst
import modbus_tk.modbus_rtu as modbus_rtu
import serial


def write_int8_to_plc(port, slave_id, address, value):
    """
    通过 Modbus RTU (串口) 向 PLC 写入 INT8 数据

    参数:
        port: 串口名称 (如 'COM3' 或 '/dev/ttyUSB0')
        slave_id: 从站 ID (PLC 的 Modbus 地址)
        address: 写入的寄存器地址
        value: 要写入的 INT8 值 (-128 到 127)
    """
    try:
        # 创建 Modbus RTU 主站
        master = modbus_rtu.RtuMaster(
            serial.Serial(
                port=port,
                baudrate=19200,  # 根据 PLC 设置调整
                bytesize=8,
                parity='N',
                stopbits=2,
                xonxoff=0
            )
        )

        # 设置超时时间
        master.set_timeout(1.0)

        # # 设置重试次数
        # master.set_retry_count(3)

        # 由于 Modbus 通常以 16 位寄存器为单位操作，
        # 我们需要将 INT8 转换为 INT16 写入
        # 注意: 有些 PLC 可能需要特殊处理 INT8

        # 写入单个寄存器 (功能码 6)
        # 对于 INT8，我们将其作为 INT16 写入
        response = master.execute(
            slave_id,
            cst.WRITE_SINGLE_REGISTER,
            address,
            output_value=int(value)
        )

        print(f"成功写入 INT8 值 {value} 到地址 {address}")
        return True

    except Exception as e:
        print(f"发生错误: {e}")
        return False
    finally:
        if 'master' in locals():
            master.close()




# 使用示例
if __name__ == "__main__":
    # 配置参数 - 根据你的实际情况修改
    SERIAL_PORT = 'COM1'  # 串口名称
    SLAVE_ID = 1  # PLC 的 Modbus 从站 ID
    REGISTER_ADDRESS = 0  # 要写入的寄存器地址
    VALUE_TO_WRITE = -42  # 要写入的 INT8 值 (-128 到 127)

    # 调用函数写入数据
    success = write_int8_to_plc(
        port=SERIAL_PORT,
        slave_id=SLAVE_ID,
        address=REGISTER_ADDRESS,
        value=VALUE_TO_WRITE
    )

    if success:
        print("写入操作成功完成")
    else:
        print("写入操作失败")





